# 员工管理系统
# 请在空白的data_txt添加以下内容，设置初始管理员
# {'jack': {'password': '123', 'is_admin': True}}|{}

# ---- 正式代码 ----
# 用户字典 姓名 密码 是否为管理员
user_info = {}
# 员工字典 员工编号 姓名 年龄 薪资
staff_info = {}

current_user = None


# 读取文件装饰器
def decorator_read_data(func):
    def inner(*args, **kwargs):
        read_data()
        res = func(*args, **kwargs)
        return res

    return inner


# 认证装饰器
def login_auth(func):
    def auth(*args, **kwargs):
        if not current_user:
            print('请登陆后使用功能！')
            if not login():
                print('登录失败不能使用该功能')
                return
        res = func(*args, **kwargs)
        return res

    return auth


# 管理员权限装饰器 非管理员不能调用功能
def admin_auth(func):
    def auth(*args, **kwargs):
        if not current_user:
            return
        print(user_info[current_user]['is_admin'])
        if not user_info[current_user]['is_admin']:
            print('仅限管理员使用该功能')
            return
        res = func(*args, **kwargs)
        return res

    return auth


def read_data():
    try:
        with open('data_txt', 'r', encoding='utf-8') as f:
            data_list = f.readline().split('|')
            global user_info
            user_info = eval(data_list[0])
            global staff_info
            staff_info = eval(data_list[1])
    except Exception:
        save_data()


def save_data():
    with open('data_txt', 'w', encoding='utf-8') as f:
        f.write(str(user_info))
        f.write('|')
        f.write(str(staff_info))


def login():
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    if user_info.get(username):
        if user_info.get(username).get('password') == password:
            print('登录成功！')
            global current_user
            current_user = username
            return True

    print('用户名或密码错误！')
    return False


@login_auth
@admin_auth
def register():
    username = input('请输入注册的用户名:').strip()
    if user_info.get(username):
        print('当前用户已存在！请重新输入')
        return register()
    password = input('请输入用户密码:').strip()

    user_info[username] = {'password': password, 'is_admin': False}
    save_data()
    print('注册成功！')
    return


@login_auth
def add_staff():
    staff_no = input_is_num('请输入员工编号:', '员工编号')

    if staff_info.get(staff_no):
        print('当前用户已存在！请重新输入')
        return add_staff()
    staff_name = input('请输入用户姓名:').strip()
    staff_age = input_is_num('请输入用户年龄:', '用户年龄')
    staff_salary = input_is_num('请输入用户薪资:', '用户薪资')

    staff_info[staff_no] = [staff_name, staff_age, staff_salary]
    save_data()
    print('添加成功！')
    return


@login_auth
def find_staff():
    staff_no = input_is_num('请输入要查询的员工编号:', '员工编号')
    if not staff_info.get(staff_no):
        print('此员工编号不存在！')
        return

    list_one_staff(staff_no)


@login_auth
def alter_salary():
    staff_no = input_is_num('请输入要修改的员工编号:', '员工编号')
    if not staff_info.get(staff_no):
        print('此员工编号不存在！')
        return

    list_one_staff(staff_no)
    new_salary = input_is_num('请输入修改后的用户薪资:', '用户薪资')
    staff_info[staff_no][2] = new_salary
    list_one_staff(staff_no)
    save_data()
    print('修改成功')


@login_auth
def show_all_staff():
    if not staff_info:
        print('目前没有员工信息，请先添加员工！')
        return

    print('员工编号'.ljust(10, ' '), '姓名'.ljust(10, ' '), '年龄'.ljust(10, ' '), '薪资'.ljust(10, ' '))
    for i in staff_info:
        staff_no = i
        staff = staff_info[i]
        print(str(staff_no).center(10, ' '), str(staff[0]).center(10, ' '), str(staff[1]).center(10, ' '),
              str(staff[2]).center(10, ' '))


@login_auth
def delete_staff():
    if not staff_info:
        print('没有员工可删除！请先添加员工')
        return
    staff_no = input_is_num('请输入要删除的员工编号:', '员工编号')
    if not staff_info.get(staff_no):
        print('此员工编号不存在！')
        return

    list_one_staff(staff_no)
    while True:
        is_delete = input('是否删除该员工？y/n:')
        if is_delete == 'y':
            staff_info.pop(staff_no)
            save_data()
            print('删除成功')
            return

        if is_delete == 'n':
            print('取消删除！')
            return
        print('输入错误！请输入y或者n')


func_dict = {
    '1': register,
    '2': login,
    '3': add_staff,
    '4': find_staff,
    '5': alter_salary,
    '6': show_all_staff,
    '7': delete_staff,
}


# 输入是否为数字
def input_is_num(msg, input_name):
    while True:
        res = input(msg).strip()
        if res.isdigit():
            return int(res)
        print('%s必须是数字！请重新输入' % input_name)


# 列出一个员工
def list_one_staff(staff_no):
    staff = staff_info.get(staff_no)
    print('员工编号'.ljust(10, ' '), '姓名'.ljust(10, ' '), '年龄'.ljust(10, ' '), '薪资'.ljust(10, ' '))
    print(str(staff_no).center(10, ' '), str(staff[0]).center(10, ' '), str(staff[1]).center(10, ' '),
          str(staff[2]).center(10, ' '))


@decorator_read_data
def run():
    while True:
        global current_user
        print('欢迎使用员工管理系统'.center(40, '*'))
        if current_user:
            new_user = current_user + '(管理员)' if user_info[current_user]['is_admin'] else '(普通用户)'
            print('当前用户: %s '.center(40, '*') % new_user)
        else:
            print('当前用户: 未登录 '.center(40, '*'))
        print('1.注册系统账号'.center(40, ' '))
        print('2.登录系统账号'.center(40, ' '))
        print('3.添加员工信息'.center(40, ' '))
        print('4.查询员工信息'.center(40, ' '))
        print('5.修改员工薪资'.center(40, ' '))
        print('6.查询所有员工'.center(40, ' '))
        print('7.删除员工信息'.center(40, ' '))
        print('输入 q 退出系统,输入 logout 退出登录'.center(40, '*'))
        order = input('请输入功能序号:').strip()

        # 退出登录功能
        if order == 'logout' and current_user is not None:
            current_user = None
        elif order == 'logout':
            print('当前未登录！')

        # 退出系统
        if order == 'q':
            print('感谢使用！退出系统')
            exit(0)

        # 执行功能
        if func_dict.get(order):
            func_dict[order]()
            input('按回车继续enter...')


run()
